
public class code2 {
//    力扣 150 反转链表
public ListNode reverseBetween(ListNode head, int left, int right) {
    // 这道题目的要求是反转局部的链表
    // 反转局部链表，在这里就需要获取到 left 左侧的元素以及 right 右侧的元素
    // 之后，将中间的链表进行反转后进行重新连接即可

    // 为了防止头结点有变化，这里在头结点的位置用上一个虚拟节点
    ListNode newNode = new ListNode(-1);
    newNode.next = head;

    // 在这里创建出一个 left 的前置节点
    ListNode front = newNode;
    for(int i = 0; i < left - 1; i++) {
        front = front.next;
    }

    // 在创建出一个节点 记录最右侧的一个节点
    ListNode behindRight = front;
    for(int j = 0; j < right - left + 1; j++) {
        behindRight = behindRight.next;
    }

    ListNode leftNode = front.next;
    ListNode behind = behindRight.next;

    // 将中间的节点切断截取出来
    front.next = null;
    behindRight.next = null;

    // 之后将这个新截取出来的链表头节点传递到一个反转方法中
    reverse(leftNode);

    // 反转之后将链表重新连接起来
    front.next = behindRight;
    leftNode.next = behind;

    return(newNode.next);
}

    private void reverse(ListNode newhead) {
        // 定义两个指针进行反转链表的操作
        ListNode p1 = null;
        ListNode p2 = newhead;

        while(p2 != null) {
            // 定义一个节点记录这个节点的后一个位置的值
            ListNode next = p2.next;
            p2.next = p1;
            p1 = p2;
            p2 = next;
        }
    }
}
